/* 信号传输链路仿真工具箱（串扰 + 眼图 + 直流压降分析）
 * ******************
 * 2025/05/16
 * 戴炜锋
 * ******************
 * 1. 概述
 * ------------------
 *   1. 输入多个端口之间的Smn宽频数据（支持从结果中导入）
 *   2. 指定发射源的信号波形
 *   3. 分析接收端口的接收信号波形
 *   4. 计算串扰
 *   5. 眼图分析
 * ******************
 * 2. 原理
 * ------------------
 *   1. 输入信号`i_n(t) * h_mn(t) -> o_m(t)` // `*`是卷积符号；i_n(t)为n号端口的输入信号，o_m(t)为m号端口的输出信号
 *   2. 输入信号可以由预设的脉冲序列进行模拟
 *   3. 输出监视端口的输出波形 -> 进一步可进行眼图分析
 *   4. 可以指定一些端口是电源线上的端口，如Vcc，可以模拟DC信号，便于分析“直流压降”。
 *   5. 不同的端口可以绑定相同的信号，但是有不同的幅度，如±1可模拟差分输入。
 * ******************
 */


 #import toolbox;
 #import props;
 #import ui;


local tb = toolbox.new_toolbox();
tb.title = _kT("SignalLinkSimulation#Toolbox");


// 初始化方法
tb.evt_init = function(model)
{
    local ec = model.evtmgr;

    // 全局设置
    ec.wm_var("unit.frequency", "unit.frequency", 3);
    ec.wm_var("unit.time", "unit.time", 1);  // m / mm / μm

    // 端口设置
    // name | type | source_name | is_monitor
    ec.wm_var("port", "port", []);

    // Smn 数据
    ec.wm_var("Smn_data", "Smn_data");

    // 脉冲波形
    ec.wm_var("pulsewave.rise_time", "pulsewave.rise_time", "0.1");
    ec.wm_var("pulsewave.drop_time", "pulsewave.drop_time", "0.1");
    ec.wm_var("pulsewave.persist_time", "pulsewave.persist_time", "0.8");
    ec.wm_var("pulsewave.period", "pulsewave.period", "10.0")

    // 信号序列
    ec.wm_var("signal.sequence", "signal.sequence", "rand.randi(2, 1000)");
    ec.wm_var("signal.modulation_type", "signal.modulation_type", 0); // 0: ASK, 1: FSK, 2: PSK
    ec.wm_var("signal.numbits", "signal.numbits", 1);
    ec.wm_var("signal.ASK.freq", "signal.ASK.freq", "10.0");
    ec.wm_var("signal.ASK.lo", "signal.ASK.lo", "0");
    ec.wm_var("signal.ASK.hi", "signal.ASK.hi", "1");
    ec.wm_var("signal.FSK.lo", "signal.FSK.lo", "9.8");
    ec.wm_var("signal.FSK.hi", "signal.FSK.hi", "10.2");
    ec.wm_var("signal.PSK.lo", "signal.PSK.lo", "0");
    ec.wm_var("signal.PSK.hi", "signal.PSK.hi", "90");


    // 单位选项
    ec.gp_beg("UF_optdata", "OptionData");
        ec.gp_add(_hT("Hz"),  0);
        ec.gp_add(_hT("KHz"), 1);
        ec.gp_add(_hT("MHz"), 2);
        ec.gp_add(_hT("GHz"), 3);
        ec.gp_add(_hT("THz"), 4);
    ec.gp_end();

    ec.gp_beg("UT_optdata", "OptionData");
        ec.gp_add("s",  0);
        ec.gp_add("ms", 1);
        ec.gp_add("μs", 2);
        ec.gp_add("ns", 3);
        ec.gp_add("ps", 4);
    ec.gp_end();

    // 事件
};

// 窗口设计
tb.dlg_init = function(ctx)
{
    local km = props.bind(ctx);

    km.win("toolbox.dialog", km.label(_hT("toolbox.simlink_adv")).flags(km.IWND_NO_RESIZABLE).sprops("icon", "simlink_adv").height(600).width(840));

    km.win("row", km.ld(5));
        km.win("col", km.ld(5).label(_hT("GlobalSettings")));
            km.win("col", km.ld(3));
                km.add("label", km.ld(1).label(_hT("unit.frequency")));
                km.add("combo", km.ld(2).name("unit.frequency").flags(km.IWND_READONLY | km.IWND_EXPAND).optdata("UF_optdata"));
            km.end();
            km.win("col", km.ld(3));
                km.add("label", km.ld(1).label(_hT("unit.time")));
                km.add("combo", km.ld(2).name("unit.time").flags(km.IWND_READONLY | km.IWND_EXPAND).optdata("UT_optdata"));
            km.end();
        km.end();
        km.win("col", km.ld(5).label(_hT("PortSettings")));
            km.win("col", km.ld(3));
                km.add("label", km.ld(1).label(_hT("port")));
                // 多列数据控件
                // Add Button to Import Port Data
            km.end();
            km.win("col", km.ld(3));
                km.win("row", km.ld(2));
                    km.add("label", km.ld(1).label(_hT("Smn_data")));
                km.end();
                km.win("row", km.ld(1));
                    km.add("button", km.ld(1).name("ViewSmnData"));
                    km.add("button", km.ld(1).name("ImportSmnData"));
                    km.add("button", km.ld(1).name("ClearSmnData"));
                km.end();
            km.end();
        km.end();
    km.end();
    km.end();
};


return toolbox.create(tb);


